package com.um2.compression.grol;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


public class PanneauImageCrominanceBleu extends JPanel {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int prefferedSizeX = 200 ;
	private int prefferedSizeY = 200 ;
	private Image image = null ;
	private PanneauCentre panneauCentre = null ;
	
	private int coinSuperieurX = 0 ;
	private int coinSuperieurY = 0 ;
	
	
	public PanneauImageCrominanceBleu(PanneauCentre centre) {
		super(true) ;
		this.panneauCentre  = centre ;
	}
	
	
	
	
	
	
	public void setImage(Image img) {
		this.image = img ;
	}
	
	
	
	
	
	
	
	public void recalculeImage() {
		
		
		

		if (this.getImageOriginale()!=null)
		{
			BufferedImage bu = new BufferedImage(this.getImageOriginale().getWidth(this),
					this.getImageOriginale().getHeight(this),
					BufferedImage.TYPE_INT_ARGB) ;
	
			BufferedImage buOriginale = Utilitaire.toBufferedImage(this.getImageOriginale()) ;
			for (int i = 0; i < this.getImageOriginale().getWidth(this); i++) {
				for (int j = 0; j < this.getImageOriginale().getHeight(this); j++) {
					// recopie stricte :
//					bu.setRGB(i, j, buOriginale.getRGB(i,j)) ;
					
					// luminance :
					Color c = new Color(buOriginale.getRGB(i,j)) ;
			        int r = c.getRed();
			        int v = c.getGreen();
			        int b = c.getBlue();
			        
			        
			        
			        int val =  (int) ((-(0.16875*r)) - (0.33126*v) + (0.5000*b)) + 128 ;
			        if (val<0)
			        	val = 0 ;
			        
			        
			        bu.setRGB(i, j,
			        		(new Color(
			        				val,
			        				val,
			        				val
			        				)).getRGB());
				}
			}
			this.image = bu ;
		}
		
		
//		
//		
//		if (this.getImageOriginale()!=null)
//		{
//			BufferedImage bu = new BufferedImage(this.getImageOriginale().getWidth(this),
//					this.getImageOriginale().getHeight(this),
//					BufferedImage.TYPE_INT_ARGB) ;
//	
//			BufferedImage buOriginale = Utilitaire.toBufferedImage(this.getImageOriginale()) ;
//			for (int i = 0; i < this.getImageOriginale().getWidth(this); i++) {
//				for (int j = 0; j < this.getImageOriginale().getHeight(this); j++) {
//					// recopie stricte :
////					bu.setRGB(i, j, buOriginale.getRGB(i,j)) ;
//					
//					// luminance :
//					Color c = new Color(buOriginale.getRGB(i,j)) ;
//			        int r = c.getRed();
//			        int v = c.getGreen();
//			        int b = c.getBlue();
//			        
//			        
//			        int val =  (int) ((+(0.5000*r)) - (0.41869*v) - (0.08131*b)) + 128 ;
//			        if (val<0)
//			        	val = 0 ;
//			        
//			        bu.setRGB(i, j,
//			        		(new Color(
//			        				val,
//			        				val,
//			        				val
//			        				)).getRGB());
//				}
//			}
//			this.image = bu ;
//		}
//		
	}

	
	
	
	
	
	
	
	@Override
	public Dimension getPreferredSize() {
		if (this.image==null)
			return new Dimension(this.prefferedSizeX,this.prefferedSizeY) ;
		return new Dimension(this.image.getWidth(this),
				this.image.getHeight(this)) ;
	}

	
	
	
	

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		
		this.dessineGrillageDeFond(g) ;
		
		
		if (this.getImage()==null)
			return ;
		
		coinSuperieurX = (this.getWidth()-this.getImage().getWidth(this))/2 ;
		if (coinSuperieurX<0)
			coinSuperieurX = -coinSuperieurX ;
		
		coinSuperieurY = (this.getHeight()-this.getImage().getHeight(this))/2 ;
		if (coinSuperieurY<0)
			coinSuperieurY = -coinSuperieurX ;
		
		g.drawImage(this.getImage(), coinSuperieurX, coinSuperieurY, this) ;
		
	}


	private void dessineGrillageDeFond(Graphics g) {
		int largeur = this.getWidth() ;
		if (this.getImage()!=null)
			largeur = this.getImage().getWidth(this) ;
		
		int hauteur = this.getHeight() ;
		if (this.getImage()!=null)
			hauteur = this.getImage().getHeight(this) ;
		
		
		if (this.getImage()!=null) {
			coinSuperieurX = (this.getWidth()-this.getImage().getWidth(this))/2 ;
			if (coinSuperieurX<0)
				coinSuperieurX = -coinSuperieurX ;
			
			coinSuperieurY = (this.getHeight()-this.getImage().getHeight(this))/2 ;
			if (coinSuperieurY<0)
				coinSuperieurY = -coinSuperieurX ;

			g.clipRect(coinSuperieurX, coinSuperieurY,
					this.getImage().getWidth(this),
					this.getImage().getHeight(this)) ;
		}
		
		boolean couleurClaire = true ;
		boolean couleurClaireInitiale = true ;
		// la largeur
		for (int i = 0; i < largeur; i=i+10) {
			// la hauteur
			couleurClaire = couleurClaireInitiale ;
			couleurClaireInitiale = !couleurClaireInitiale ;
			for (int j = 0; j < hauteur; j=j+10) {
				if (couleurClaire)
				{
					g.setColor(new Color(0x777777)) ;
				}else {
					g.setColor(new Color(0xBBBBBB)) ;
				}
				g.fillRect(coinSuperieurX+i, coinSuperieurY+j, 10, 10) ;
				couleurClaire = !couleurClaire ;
			}
		}
		
		g.clipRect(0, 0,
				this.getWidth(),
				this.getHeight()) ;
		
	}


	public Image getImage() {
		return image;
	}
	
	public Image getImageOriginale() {
		return this.panneauCentre.getPanneauImageOriginale().getImage() ;
	}
	

}
